
/**
 * 
 * @author Claudio
 * @author Felipe
 * 
 * <p>20/11 - 
 * 		1) Criação do método jogar, chamado pelo sistema no turno de cada jogador - Alteração de interface e Implementação.
 * 		2) Modificação de interface e implementação do metodo puxar carta - deck passou de List para Stack conforme a classe Jogo
		   pasosu a retornar um boolean para afirmar se foi possivel ou não puxar cartas, foi retirado o parametro List<Cartas> mao pois ja pertence a classe.
		3)Criação do método para validar cartas na mão.
		4)Criação do método para validar carta unica. 
		5)OBS: algumas partes do método estão comentadas pois não existe métodos necessarios para o mesmo.
		   </p>
 */

public interface IJogador {

	/**
	 * Metodo responsÃ¡vel por adicionar na pilha de descarte a carta selecionada pelo jogador.
	 * 
	 * Pre-condicÌ§aÌƒo: 
		- A maÌƒo do jogador naÌƒo pode ser vazia.
		- A carta deve ser vaÌ�lida de acordo com o descarte.
		- Deve ser o turno do jogador.
		- A maÌƒo do jogador deve ter ao menos uma carta vaÌ�lida.
		- O jogador naÌƒo pode ter jogado carta alguma neste turno.
	 * 
	 * Pos-condicÌ§aÌƒo:
		- Retorna a carta jogada para o descarte.
	 * 
	 * @param possicaoCarta
	 * @return carta
	 */
//	public Carta jogarCarta(int possicaoCarta);
	
	/**
	 * Metodo responsÃ¡vel por puxar cartas do deck e adicona-las a mao do jogador.
	 * 
	 * Pre-condicÌ§aÌƒo:
		- Deve ser o turno do jogador.
		- NaÌƒo pode ter excedido seu limite de 3 cartas puxadas por turno. 
		- O baralho deve ter cartas.
	 * 
	 * Pos-condicÌ§aÌƒo:
		- A carta puxada deve ser adicionada a maÌƒo do jogador.
	 * 
	 * @param deck
	 * @param mao
	 * @return mao
	 */
//	public boolean puxarCarta(Stack<Carta> deck, int numeroDeCartas);
	
	/**
	 * Metodo responsÃ¡vel por informa para o jogo que o jogado possui apenas uma carta na mao.
	 * 
	 * Pre-condicÌ§aÌƒo:
		- Deve ser o turno do jogador.
		- Deve ter jogado alguma carta no turno. 
		- Deve ter somente uma carta na maÌƒo.
	 * 
	 * Pos-condicÌ§aÌƒo:
		- Manda para o sistema o jogador que estaÌ� em UNO
	 * 
	 * @param mao
	 * @return true caso a mao do jagodor possua apenas uma carta.
	 */
//	public boolean declararUno(List<ICarta> mao);
	
	
	/**
	 * Metodo responsÃ¡vel por passar o turno para o proximo jogador.
	 * 
	 * Pre-condicÌ§aÌƒo:
		- Deve ser o turno do jogador.
		- O jogador ja deve ter jogado ou nao possuir jogada vaÌ�lida apoÌ�s estourar o limite de vezes que pode puxar cartas.
	 * 
	 * Pos-condicÌ§aÌƒo:
		- Manda para o sistema uma mensagem avisando que o jogador passou o turno.
	 * 
	 * @param idJogadorAtual
	 * @return idProximoJogador
	 */
//	public int passarTurno(int idJogadorAtual);
	
	
	/**
	 * Metodo responsÃ¡vel por determinar a cor escolhida pelo usuÃ¡rio.
	 * 
	 * PrÃ©=condiÃ§Ã£o:
	 * - A carta descartada pelo jogador seja um curinga.
	 * 
	 * PÃ³s-condiÃ§Ã£o:
	 * - A cor do jogo serÃ¡ a cor selecionada pelo usuÃ¡rio.
	 * 
	 * @return
	 */
//	public Cor escolherCor();
	
	
	/**
	 * 
	 * @param TopoDescarte Carta no topo do descarte.
	 * @return Retorna se possui alguma carta valida na mão ou nao.
	 */
//	public boolean ValidarMao(Carta TopoDescarte);
	
	/**
	 * 
	 * @param TopoDescarte Carta no topo do descarte.
	 * @param Validar Carta para ser validada.
	 * @return Se a carta foi validada ou nao.
	 */
//	public boolean ValidarCarta(Carta TopoDescarte, Carta Validar);
	
	/**
	 * 
	 * @param Descarte Todo o descarte, necessario para fazer alterações sobre o mesmo.
	 * @param Deck	O deck
	 * @param CorAtual A cor que está valendo no jogo.
	 * 
	 * <p>Responsabilidade de efeitos de cartas passada pra classe jogo</p>
	 */
//	public void Jogar(Stack<Carta> Descarte, Stack<Carta> Deck, Cor CorAtual);
	
}
